﻿#ifndef FINGERPRINTCACHEDB_H
#define FINGERPRINTCACHEDB_H
#include <QObject>
#include <windows.h>

namespace ZKFP
{

QString BlobToBase64(QByteArray regTemplate);
QByteArray Base64ToBlob(QString base64String);

/**
 * @brief The FingerprintCacheDB class 指纹识别类，用来进行 1:N 的指纹识别。
 *
 */
class FingerprintCacheDB : public QObject
{
    Q_OBJECT
public:
    FingerprintCacheDB(QObject *parent = nullptr);
    ~FingerprintCacheDB();
    /**
     * @brief verifyFinger 比较两个指纹是否是同一个手指的
     * @param regTemplate 指纹 1
     * @param verTemplate 指纹 2
     * @return 0 - 100 分数越高表明匹配度越好
     */
    int verifyFinger(QByteArray regTemplate, QByteArray verTemplate);
    /**
     * @brief mergeFinger 将三个指纹模板合并成一个
     * @param inTemplate1
     * @param inTemplate2
     * @param inTemplate3
     * @param outTemplate
     * @return
     */
    int mergeFinger(QByteArray inTemplate1, QByteArray inTemplate2, QByteArray inTemplate3, QByteArray &outTemplate);
    int identify(QByteArray inTemplate, unsigned int &fingerID, unsigned int &score);
    int identify(QString base64String, unsigned int &fingerID, unsigned int &score);
    /**
     * @brief count 返回指纹数据库中的数据条数
     * @return
     */
    int count() const;

public slots:
    /**
     * @brief clearAll 清空指纹数据库
     * @return
     */
    int clearAll();
    /**
     * @brief deleteItem 删除 fingerID 对应的数据
     * @param fingerID
     * @return
     */
    int deleteItem(unsigned int fingerID);
    /**
     * @brief addItem 将一个指纹模板登记到指纹数据库中，同时设置这个指纹模板的 ID 为 fingerID.
     * @param fingerID
     * @param regTemplate
     * @return
     */
    int addItem(unsigned int fingerID, QByteArray regTemplate);
    int addItem(unsigned int fingerID, QString base64String);

private:
    HANDLE m_hDBCache;//缓存区句柄
};

}
#endif // FINGERPRINTCACHEDB_H
